package org.zachary.imitation.raft.util;

import org.zachary.imitation.raft.Node;
import org.zachary.imitation.raft.NodeImpl;
import org.zachary.imitation.raft.option.NodeOptions;
import org.zachary.imitation.raft.PeerId;

/**
 * 使用工厂类用来执行复杂的创建节和初始化节点的逻辑，等价于 陈风飞扬 写的 RaftServiceFactory
 */
public final class NodeBuilder {

	/** 根据用户配置的信息创建一个节点的实现类对象 */
	public static Node createRaftNode(final String groupId, final PeerId serverId) {
		return new NodeImpl(groupId, serverId);
	}

	/** 据用户配置的信息创建一个 NodeImpl 对象，并且初始化这个节点对象，在初始化节点的过程中，当前节点需要的组件就一一启动了 */
	public static Node createAndInitRaftNode(final String groupId, final PeerId serverId, final NodeOptions opts) {
		final Node ret = createRaftNode(groupId, serverId);
		// 初始化节点
		if (!ret.init(opts)) {
			throw new IllegalStateException("Fail to init node, please see the logs to find the reason.");
		}
		return ret;
	}
}
